package com.yangli.leecode.a;

import java.util.Stack;

/**
 * @author ly
 * @description #https://leetcode-cn.com/problems/reverse-integer/
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * @data 2022/4/22
 */
public class ReverseInt {
    public static void main(String[] args) {
        ReverseInt reverseInt = new ReverseInt();
        System.out.println(reverseInt.reverse(1534236469));
    }

    //转化成字符串 栈转换
    public int reverse(int x) {
        if (x == 0) {
            return 0;
        }
        char[] chars = String.valueOf(x).toCharArray();
        Stack<Character> stack = new Stack<>();
        boolean unsgin = true;
        for (int i = 0, j = chars.length; i < j; ++i) {
            if (i == 0 && chars[0] == '-') {
                unsgin = false;
            } else {
                if (i == (j - 1) && chars[0] == '0') {
                    break;
                }
                stack.push(chars[i]);
            }
        }
        StringBuilder sb = new StringBuilder(unsgin ? "" : "-");
        while (!stack.empty()) {
            sb.append(stack.pop()); //peek取出栈顶元素并不删除 pop取出并删除元素
        }
        long temp = Long.parseLong(sb.toString());
        if (temp > Integer.MAX_VALUE || temp < Integer.MIN_VALUE) {
            return 0;
        }
        return Integer.parseInt(sb.toString());
    }

    //int求余
    public int reverse2(int x) {
        int res = 0;
        while (x != 0) {
            //rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10 数学推导过程
            //判断是否 大于 最大32位整数
            int digist = x % 10; //变量取余

            if (res > 214748364 || (res == 214748364 && digist > 7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            if (res < -214748364 || (res == -214748364 && digist < -8)) {
                return 0;
            }
            x /= 10; //变量取余
            res = res * 10 + digist; //返回值变化
        }
        return res;
    }
}
